class Solution {
    int dx[4] = {0, 0 , -1, 1}; // i点加dx，dy就是i点的上下左右下标
    int dy[4] = {1, -1 , 0, 0};
    bool vis[51][51] = {false};
    int m = 0, n = 0, cnt = 0;
 
public:
    int maxAreaOfIsland(vector<vector<int>>& grid) {
        m = grid.size(), n = grid[0].size();
        int ret = 0;
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                if(grid[i][j] == 1 && !vis[i][j])
                {
                    cnt = 1;
                    ret = max(ret, dfs(grid, i, j)); // 碰到1就算周围的1并标记
                }
            }
        }
        return ret;
    }
 
    int dfs(vector<vector<int>>& grid, int sr, int sc)
    {
        vis[sr][sc] = true;
        for(int i = 0; i < 4; ++i)
        {
            int x = sr + dx[i], y = sc + dy[i];
            if(x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == 1 && !vis[x][y])
            {
                ++cnt;
                dfs(grid, x, y);
            }
        }
        return cnt;
    }
};